package cn.kgc.utils;

import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

/**
 * @author YC
 * 第三方接口重试
 */
@Slf4j
@Component
@EnableRetry
public class SmsSenderRetry {

    /**
     * 模拟第三方接口发送短信
     *
     * @return 是否成功
     */
    private boolean mockSend(String phoneNumber, String code) {
        int number = Integer.parseInt(RandomUtil.randomNumbers(1));
        if (number < 8) {
            // 模拟第三方接口发送短信成功
            log.info("短信发送成功，手机号：{}，验证码：{}", phoneNumber, code);
            return true;
        } else if (number == 8) {
            // 模拟第三方接口发送短信失败
            log.info("短信发送失败，手机号：{}，验证码：{}", phoneNumber, code);
            return false;
        } else {
            // 模拟第三方接口发送短信异常
            log.info("短信发送异常，手机号：{}，验证码：{}", phoneNumber, code);
            throw new RuntimeException("第三方接口发送短信异常");
        }
    }

    /**
     * 发送短信（失败后重试3次版）
     * 注解@Retryable指定重试的异常类型，重试次数，重试间隔（multiplier每次重试是之间的2倍时间）
     */
    @Retryable(value = {Exception.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 2))
    public void sendSms(String phoneNumber, String code) {
        mockSend(phoneNumber, code);
    }

    @Recover
    public void recoverSendSms(Exception e) {
        log.error("短信发送失败，重试3次后仍然失败,请检查手机号是否正确。或联系管理员");
    }

}
